/* 
 * File:   chronologie.cpp
 * Author: landry
 * 
 * Created on 10 octobre 2009, 16:49
 */

#include "chronologie.h"
#include "queue.h"

int Chronologie::compareEvent(Evenements e1, Evenements e2){
    int n = 0;
    if(e1.instant > e2.instant)
        return -1;
    else
        if(e1.instant < e2.instant)
            return 1;
        else
            return 0;
}

Chronologie::Chronologie() {
}

Chronologie::Chronologie(const Chronologie& orig) {
}

Chronologie::~Chronologie() {
}

void Chronologie::addEvent(Evenements event){
    ListeEvenements.push_back(event);
    horlogeSysteme.updeteHorloge();
    //trie de la liste des evenements
   //this->sortListEvent();
}

void Chronologie::sortListEvent(){

   Evenements tab[ListeEvenements.size()];

   //copie de la liste dans le tableau
   list<Evenements>::iterator l;

   int k=0;
   for(l=ListeEvenements.begin();l != ListeEvenements.end();l++){
            Evenements cl = *l;
            tab[k] = cl;
            k++;
   }

   //for(int k = 0;k<this->eventList.size();k++)
     //   tab[k] = this->eventList.at(k);

   int taille = ListeEvenements.size();
   int t, maximum;
   int longueur = ListeEvenements.size();
   while(longueur>0)
   {
      // recherche de la plus grande valeur du tableau
      maximum = 0;
      for(t=1; t<longueur; t++){
          int s = compareEvent(tab[t],tab[maximum]);
          if( s == -1)// l'evenement tab[i] survient apres l'evenement tab[maximum]
             maximum = t;
      }
      // echange du maximum avec le dernier élément
      Evenements evt = tab[maximum];
      tab[maximum] = tab[longueur-1];
      tab[longueur-1] = evt;
      // on traite le reste du tableau
      longueur--;
   }

   //on efface le contenu du vecteur
   ListeEvenements.clear();

   //Il faut ranger les evenements tel que le depart soit toujour traite avant
   //l'arrivee pour des evenements arrivant au meme instant

   for(int a = 0;a<taille-1;a++){
       if((tab[a].instant == tab[a+1].instant) && tab[a+1].cType=='d'){
           //echanger les positions de ces deux evenements
           Evenements evt = tab[a+1];
           tab[a+1] = tab[a];
           tab[a] = evt;
       }
   }

   //recopie du tableau dans la liste des evenements
   for(int i= 0;i< taille;i++){
    tab[i].num_event = i;
    ListeEvenements.push_back(tab[i]);

   }

}

void Chronologie::removeEvent(){
    //on supprime toujours l'evenement en tete de liste
       ListeEvenements.pop_front();
}

Chronologie *Chronologie::_singleton = NULL;